package br.com.pguide.parser;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.util.Log;
import br.com.pguide.estrutura.Estabelecimento;
import br.com.pguide.estrutura.Item;
import br.com.pguide.estrutura.ItemEstabelecimento;
import br.com.pguide.estrutura.ItemLista;
import br.com.pguide.estrutura.Perfil;
import br.com.pguide.estrutura.Preferencias;
import br.com.pguide.utils.Mensagem;
import br.com.pguide.webservice.WebService;

public class Parser {
	
	public static ArrayList<Estabelecimento> get_estabelecimentos(String query, Activity activity) {
		JSONArray jarray = new JSONArray();
		ArrayList<Estabelecimento> estabs = new ArrayList<Estabelecimento>();
		try {
			jarray = new JSONArray(query);
			for (int i=0; i<jarray.length(); i++) {
				JSONObject jobject = new JSONObject(jarray.getJSONObject(i).toString());
				JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());
				Estabelecimento est = new Estabelecimento();
				est.setId(jobject.getInt("pk"));
				est.setCnpj(fields.getString("cnpj"));
				est.setReputacaoID(fields.getInt("reputacao"));
				est.setNome_curto(fields.getString("nome_curto"));
				est.setNome_completo(fields.getString("nome_completo"));
				est.setCidade(fields.getString("cidade"));
				est.setEstado(fields.getString("estado"));
				est.setBairro(fields.getString("bairro"));
				est.setEndereco(fields.getString("endereco"));
				est.setLatitude(fields.getDouble("latitude"));
				est.setLongitude(fields.getDouble("longitude"));
				estabs.add(est);
			}
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
			Log.i("PGUIDE PARSER ERROR", e.getMessage());
		}
		return estabs;
	}
	
	public static ArrayList<ItemEstabelecimento> buscar_ofertas(String query, String username, Activity activity) {
		ArrayList<ItemEstabelecimento> lista = new ArrayList<ItemEstabelecimento>();
		try {
			JSONObject jobject = new JSONObject(query);
			JSONArray j  = new JSONArray(jobject.getJSONArray("lista").toString());
			for (int i=0; i<j.length(); i++) {
				lista.add(Parser.get_item_estabelecimento(WebService.get_item_estabelecimento(j.getInt(i)), username, activity));
			}
			Log.i("QTD", lista.size()+"");
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
			Log.i("PGUIDE PARSER ERROR", e.getMessage());
		}
		return lista;
	}
	
	public static double getReputacao_Media(String query, Activity activity) {
		double media = 0;
		try {
			JSONObject jobject = new JSONObject(query);
			media = jobject.getDouble("media");
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
			Log.i("PGUIDE PARSER ERROR", e.getMessage());
		}
		return media;
	}
	
	public static int getReputacao_QuantidadeDeAvaliacoes(String query, Activity activity) {
		int qtd_avaliacoes = 0;
		try {
			JSONObject jobject = new JSONObject(query);
			qtd_avaliacoes = jobject.getInt("avaliacoes");
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
			Log.i("PGUIDE PARSER ERROR", e.getMessage());
		}
		return qtd_avaliacoes;
	}
	
	public static Preferencias get_preferencias(String query, Activity activity) {
		JSONObject jobject = new JSONObject();
		try {
			jobject = new JSONObject(query);
			Preferencias prefs = new Preferencias();
			prefs.setFormasPagamento(jobject.getString("formasPagamento").toString());

			prefs.setMinPrecoItem(jobject.getDouble("minPrecoItem"));
			prefs.setMaxPrecoItem(jobject.getDouble("maxPrecoItem"));
			prefs.setRelevanciaPrecoItem(jobject.getDouble("relevanciaPrecoItem"));

			prefs.setMinDistanciaItem(jobject.getDouble("minDistanciaItem"));
			prefs.setMaxDistanciaItem(jobject.getDouble("maxDistanciaItem"));
			prefs.setRelevanciaDistanciaItem(jobject.getDouble("relevanciaDistanciaItem"));

			prefs.setMinReputacaoItem(jobject.getDouble("minReputacaoItem"));
			prefs.setMaxReputacaoItem(jobject.getDouble("maxReputacaoItem"));
			prefs.setRelevanciaReputacaoItem(jobject.getDouble("relevanciaReputacaoItem"));
			
			return prefs;
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
			Log.i("PGUIDE PARSER ERROR", e.getMessage());
		}
		return null;
	}
	
	public static ArrayList<String> get_formas_de_pagamento(String query, Activity activity) {
		ArrayList<String> formas = new ArrayList<String>();
		JSONArray jarray = new JSONArray();
		try {
			jarray = new JSONArray(query);
			for(int i=0; i<jarray.length(); i++) {
				JSONObject jobject = new JSONObject(jarray.get(i).toString());
				JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());
				formas.add(fields.getString("forma_de_pagamento"));
			}
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
		}
		return formas;
	}
	
	public static Estabelecimento get_estabelecimento(String query, Activity activity) {
		Estabelecimento estabelecimento = new Estabelecimento();
		JSONArray jarray = new JSONArray();
		try {
			jarray = new JSONArray(query);
			JSONObject jobject = new JSONObject(jarray.get(0).toString());
			JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());

			estabelecimento.setId(jobject.getInt("pk"));
			estabelecimento.setCnpj(fields.getString("cnpj"));
			estabelecimento.setNome_curto(fields.getString("nome_curto"));
			estabelecimento.setNome_completo(fields.getString("nome_completo"));
			estabelecimento.setCidade(fields.getString("cidade"));
			estabelecimento.setBairro(fields.getString("bairro"));
			estabelecimento.setEndereco(fields.getString("endereco"));
			estabelecimento.setEstado(fields.getString("estado"));
			estabelecimento.setLatitude(fields.getDouble("latitude"));
			estabelecimento.setLongitude(fields.getDouble("longitude"));
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage().toString(), activity);
		}
		return estabelecimento;
	}
	
	public static ArrayList<ItemEstabelecimento> busca_recomendacao_produto_unico(String querylist, String username, Activity activity) {
		ArrayList<ItemEstabelecimento> itens = new ArrayList<ItemEstabelecimento>();
		JSONArray jarray = new JSONArray();
		try {
			jarray = new JSONArray(querylist);
			for (int i=0; i<jarray.length(); i++) {
				ItemEstabelecimento item = new ItemEstabelecimento();
				JSONObject jobject = new JSONObject(jarray.get(i).toString());
				JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());

				int item_id = fields.getInt("item");
				ItemEstabelecimento localItem = Parser.get_item_estabelecimento(WebService.get_item_estabelecimento(item_id), username, activity);

				item.setPontuacao(fields.getDouble("pontuacao"));
				item.setEstabelecimento(localItem.getEstabelecimento());
				item.setDesconto(localItem.getDesconto());
				item.setDisponibilidade(localItem.getDisponibilidade());
				item.setPreco(localItem.getPreco());
				item.setData(localItem.getData());
				itens.add(item);
			}
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage(), activity);
		}
		return itens;
	}
	
	public static ArrayList<ItemEstabelecimento> busca_recomendacao_lista (String querylist, String username, Activity activity) {
		ArrayList<ItemEstabelecimento> itens = new ArrayList<ItemEstabelecimento>();
		JSONArray jarray = new JSONArray();
		try {
			jarray = new JSONArray(querylist);
			for (int i=0; i<jarray.length(); i++) {
				ItemEstabelecimento item = new ItemEstabelecimento();
				JSONObject jobject = new JSONObject(jarray.get(i).toString());
				JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());

				int estabelecimento = fields.getInt("estabelecimento");

				item.setPontuacao(fields.getDouble("pontuacao"));
				item.setEstabelecimento(Parser.get_estabelecimento(WebService.get_estabelecimento(estabelecimento), activity));
				
				item.setDesconto(0);
				item.setDisponibilidade(0);
				item.setPreco(fields.getDouble("preco_total"));
				item.setData(null);
				itens.add(item);
			}
		} catch (Exception e) {
			Mensagem.exibirMensagem("oops: " + e.getMessage(), activity);
			Log.i("Erro", e.getMessage().toString());
		}
		return itens;
	}
	
	public static ItemEstabelecimento get_item_estabelecimento (String querylist, String username, Activity activity) {
		JSONArray jarray = new JSONArray();
		ItemEstabelecimento item = null;
		try {
			jarray = new JSONArray(querylist);
			item = new ItemEstabelecimento();
			if (jarray.length()>0) {
				JSONObject jobject = new JSONObject(jarray.get(0).toString());
				JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());
				
				item.setID(jobject.getInt("pk"));
				//item.setItem(WebService.get_nome_item(username, jobject.getInt("item")));
				item.setEstabelecimento(Parser.get_estabelecimento(WebService.get_estabelecimento(fields.getInt("estabelecimento")), activity));
				item.setDesconto(fields.getDouble("desconto"));
				item.setDisponibilidade(fields.getInt("disponibilidade"));
				item.setPreco(fields.getDouble("preco"));
				item.setData(fields.getString("data"));
			}
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage(), activity);
		}
		return item;
	}
	
	public static ArrayList<ItemLista> get_lista_de_compras (String querylist, Activity activity) {
		ArrayList<ItemLista> itens = new ArrayList<ItemLista>();
		JSONArray jarray = new JSONArray();
		
		try {
			jarray = new JSONArray(querylist);
			for (int i=0; i<jarray.length(); i++) {
				ItemLista item = new ItemLista();
				JSONObject jobject = new JSONObject(jarray.get(i).toString());
				JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());
				
				item.setID(jobject.getInt("pk"));
				item.setStatus(fields.getInt("status"));
				item.setQuantidade(Float.parseFloat(fields.getDouble("quantidade")+""));
				item.setItem(fields.getInt("item"));
				itens.add(item);
			}
		} catch (Exception e) {
			Mensagem.exibirMensagem(e.getMessage(), activity);
		}
		
		return itens;
	}
	
	// transforma um resultado json em um item quando a busca é por barcode
	public static Item get_item (String query) {
		Item item = new Item();
		JSONArray jarray = new JSONArray();
		try {
			jarray = new JSONArray(query);
			JSONObject jobject = new JSONObject(jarray.get(0).toString());
			JSONObject fields = new JSONObject(jobject.getJSONObject("fields").toString());
			item.setNome(fields.getString("nome"));
			item.setCategoria(fields.getInt("categoria"));
			item.setCodigo(fields.getString("codigo"));
			item.setMarca(fields.getString("marca"));
			item.setTamanho(fields.getString("tamanho"));
			item.setUnidade_de_medida(fields.getInt("unidade"));
			item.setID(jobject.getInt("pk"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (jarray.length() != 0) {
			return item;
		}
		return null;
	}
	
	// transforma um resultado json em um id (inteiro)
	public static int get_item_id (String query) {
		try {
			JSONObject jobject = new JSONObject(query);
			return jobject.getInt("item_id");
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return -1;
	}
	
	// transforma um resultado json em um array de unidades de medida (strings)
	public static String[] lista_unidades_de_medida (String querylist) {
		JSONArray array = new JSONArray();
		try {
			JSONObject fields = new JSONObject(querylist);
			array = fields.getJSONArray("unidades");
		} catch (JSONException e) {
			
		}
		String[] unidades = new String[array.length()];
		try {
			for (int i=0; i<array.length(); i++) {
				unidades[i] = (String) array.get(i);
			}
		} catch (Exception e) {
			
		}
		return unidades;
	}
	
	// transforma um resultado json em um array de categorias (strings)
	public static String[] lista_categorias (String querylist) {
		JSONArray array = new JSONArray();
		try {
			JSONObject fields = new JSONObject(querylist);
			array = fields.getJSONArray("categorias");
		} catch (JSONException e) {
			
		}
		String[] categorias = new String[array.length()];
		categorias[0] = "";
		try {
			for (int i=0; i<array.length(); i++) {
				categorias[i+1] = (String) array.get(i);
			}
		} catch (Exception e) {
			
		}
		return categorias;
	}
	
	// transforma um resultado json arraylist de itens
	public static ArrayList<Item> busca_por_item (String querylist) {
		ArrayList<Item> array = new ArrayList<Item>();
		try {
			JSONArray json_array = new JSONArray(querylist);
			
			for (int i=0; i<json_array.length(); i++) {
				Item item = new Item();
				JSONObject json_object = new JSONObject(json_array.get(i).toString());
				JSONObject object = new JSONObject(json_object.get("fields").toString());
				item.setNome(object.get("nome").toString());
				item.setCodigo(object.get("codigo").toString());
				item.setTamanho(object.get("tamanho").toString());
				item.setMarca(WebService.get_marca(object.getInt("marca")));
				item.setCategoria(object.getInt("categoria"));
				item.setUnidade_de_medida(object.getInt("unidade"));
				item.setID(json_object.getInt("pk"));
				array.add(item);
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return array;
	}
	
	// transforma um resultado json em um objeto Perfil
	public static Perfil get_perfil(String profile) {
		Perfil perfil = new Perfil();
		try {
			JSONObject profileJSONObject = new JSONObject(profile);
			if (!profileJSONObject.getString("username").equals("-1")) {
				perfil.setNome(profileJSONObject.getString("nome"));
				perfil.setSobrenome(profileJSONObject.getString("sobrenome"));
				perfil.setEmail(profileJSONObject.getString("email"));
				perfil.setCidade(profileJSONObject.getString("cidade"));
				perfil.setEstado(profileJSONObject.getString("estado"));
				return perfil;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
